package com.sap.sap_mangers.service;

import com.sap.sap_mangers.Vo.ShareVo.ApprovedShareRecord;
import com.sap.sap_mangers.Vo.ShareVo.SapShareVo;
import com.sap.sap_mangers.dto.share.ModifyFile;
import com.sap.sap_mangers.dto.share.UploadFile;
import com.sap.sap_mangers.pojo.SapShare;
import com.sap.sap_mangers.pojo.SapShareType;
import com.sap.sap_mangers.until.SimpleJson;

import java.util.List;

/**
 * @author 阿东
 * @date 2022/9/12 [0:31]
 */
public interface ShareService {
    /**
     * 上传文件，写入信息到数据库
     *
     * @param uploadFile 上传文件相关信息
     * @return 视图
     */
    SimpleJson uploadFile(UploadFile uploadFile);

    /**
     * 把第三方云盘的网址写入到数据库
     *
     * @param uploadFile 文件相关信息
     * @return 视图
     */
    SimpleJson addFileUrl(UploadFile uploadFile);

    /**
     * 获取资料类型
     *
     * @return 资料类型
     */
    List<SapShareType> getSapShareType();

    /**
     * 根据ID获取对应资料类型
     *
     * @param shareTypeId 资料类型ID
     * @return 资料类型
     */
    SapShareType getSapShareTypeById(Integer shareTypeId);

    /**
     * 获取未审核的上传记录
     *
     * @return 未审核的资料上传记录
     */
    List<SapShareVo> getSapShareThatNotNotBeAudited();

    /**
     * 获取所有上传记录
     *
     * @return 所有上传记录
     */
    List<SapShareVo> getAllSapShare();

    /**
     * 更新共享状态
     *
     * @param id    表ID
     * @param value 更新的值(0:公开，1:私密)
     */
    void updateShared(Integer id, Integer value);

    /**
     * 根据学号获取资料表的信息
     *
     * @param username 学号
     * @param approval 资料状态(0：未审核，1：通过审核，2:未通过审核，3：删除，4:被修改)
     * @return 信息
     */
    List<SapShare> getSapShare(String username, Integer approval);

    /**
     * 根据学号获取资料表的信息(用户端)
     *
     * @param username 学号
     * @return 信息
     */
    List<SapShareVo> getSapShareForUser(String username);

    /**
     * 删除文件
     *
     * @param id 文件的id
     * @return JSON
     */
    SimpleJson deleteFile(Integer id);

    /**
     * 更新下载的次数，每访问一次+1
     *
     * @param id 资料id
     */
    void updateDownloadFile(Integer id);

    /**
     * 通过id获取资料信息
     *
     * @param id id
     * @return 资料信息
     */
    SapShare getShareMessageById(Integer id);

    /**
     * 获取可共享的资料 (按分享方式和资料类型分类嵌套)
     *
     * @return 可共享的资料
     */
    ApprovedShareRecord getApprovedShareRecord();

    /**
     * (修改资料)上传修改后的文件资料，写入信息到数据库 并添加版本更替数据(审核通过后自动更替版本，将旧版本过期)
     *
     * @param modifyFile 修改后的资料
     * @return Json
     */
    SimpleJson modifyFile(ModifyFile modifyFile);

    /**
     * (修改资料) 把第三方云盘的网址写入到数据库 并添加版本更替数据(审核通过后自动更替版本，将旧版本过期)
     *
     * @param modifyFile 文件相关信息
     * @return 视图
     */
    SimpleJson addFileUrlWhenModify(ModifyFile modifyFile);

    /**
     * 审核驳回(不通过)
     * <p>
     * 只有管理层能使用，将没通过的资料上传记录驳回(不通过)
     * 增加了修改版本信息表的逻辑，代码不再捕获SQL异常，改为提供事务支持，由Controller层捕获处理事务
     *
     * @param shareId 资料分享记录ID
     * @param reason  驳回原因
     * @return JSON
     */
    SimpleJson failedToPassTheAudit(Integer shareId, String reason);

    /**
     * 审核通过
     * <p>
     * 只有管理层能使用，将资料分享上传记录通过，使其他人能访问
     * 事务支持
     *
     * @param shareId 资料分享记录ID
     * @return JSON
     */
    SimpleJson passTheAudit(Integer shareId);

    /**
     * 获取可共享的资料中下载/访问次数前十名的数据
     *
     * @return 可共享的下载量前十的资料
     */
    List<SapShareVo> getApprovalTopTen();
}
